package cn.jinjimi.app.store.helper;

import cn.jinjimi.base.Task.TaskExecutor;
import cn.jinjimi.base.preference.PreferenceManager;
import cn.jinjimi.base.util.DateUtils;
import cn.jinjimi.base.util.GsonUtils;
import cn.jinjimi.base.util.MD5Utils;
import cn.jinjimi.app.AccountManager;
import cn.jinjimi.app.entity.ActivityInfo;
import cn.jinjimi.app.store.DatabaseManager;
import cn.jinjimi.app.store.dao.NoticeEntityDao;
import cn.jinjimi.app.store.entity.NoticeEntity;
import cn.jinjimi.app.bean.SharePrefKeys;

import java.util.List;

/**
 * Created by Roy
 * Date: 16/11/21
 */

public class NoticeDbHelper {

    public static void insertOrUpdateEntity(Iterable<NoticeEntity> noticeEntityIterator) {
        DatabaseManager.getInstance().getNoticeEntityDao().insertOrReplaceInTx(noticeEntityIterator);
    }

    /**
     * 根据ActivityInfo设置红点数据
     *
     * @param activityInfo
     */
    public static void setActivityAlertNotice(final ActivityInfo activityInfo) {
        TaskExecutor.executeTask(new Runnable() {
            @Override
            public void run() {
                List<NoticeEntity> noticeEntities = DatabaseManager.getInstance().getNoticeEntityDao().queryBuilder()
                        .where(NoticeEntityDao.Properties.NoticeId.eq(getMD5Id(activityInfo.link)))
                        .list();

                if (noticeEntities == null || noticeEntities.isEmpty()) {
                    // 插入新数据
                    insertOrUpdateEntity(NoticeEntity.createNoticeEntities(activityInfo));
                    PreferenceManager.setData(SharePrefKeys.PREF_ACTIVITYINFO_CACHE_RED_KEY, GsonUtils.toJson(activityInfo));
                } else if (!DateUtils.isToday(noticeEntities.get(0).startTime)) {// 数据为昨天数据
                    // 直接清掉旧数据
                    DatabaseManager.getInstance().getNoticeEntityDao().deleteInTx(noticeEntities);
                    insertOrUpdateEntity(NoticeEntity.createNoticeEntities(activityInfo));
                    PreferenceManager.setData(SharePrefKeys.PREF_ACTIVITYINFO_CACHE_RED_KEY, GsonUtils.toJson(activityInfo));
                } else if (!GsonUtils.toJson(activityInfo).equals(PreferenceManager.getStringData(SharePrefKeys.PREF_ACTIVITYINFO_CACHE_RED_KEY))) {
                    // 数据与缓存数据不一致
                    // 直接清掉旧数据
                    DatabaseManager.getInstance().getNoticeEntityDao().deleteInTx(noticeEntities);
                    insertOrUpdateEntity(NoticeEntity.createNoticeEntities(activityInfo));
                    PreferenceManager.setData(SharePrefKeys.PREF_ACTIVITYINFO_CACHE_RED_KEY, GsonUtils.toJson(activityInfo));
                }
            }
        });
    }

    /**
     * 判断当前的ActivityInfo是否有红点提醒
     * <p>
     * 此接口为高频调用，故修改为只查询一次指定条件的结果，不做其他任何操作
     *
     * @param link
     * @return
     */
    public static boolean haveNotice(String link) {
        long count = DatabaseManager.getInstance().getNoticeEntityDao().queryBuilder()
                .where(NoticeEntityDao.Properties.NoticeId.eq(getMD5Id(link)))
                .where(NoticeEntityDao.Properties.HadShowed.eq(false))
                .where(NoticeEntityDao.Properties.StartTime.le(System.currentTimeMillis()))
                .where(NoticeEntityDao.Properties.ExpirTime.ge(System.currentTimeMillis()))
                .count();
        return count != 0;
    }

    /**
     * 点击活动flag消失红点
     *
     * @param link
     */
    public static void clickNotice(final String link) {
        TaskExecutor.executeTask(new Runnable() {
            @Override
            public void run() {
                List<NoticeEntity> noticeEntities = DatabaseManager.getInstance().getNoticeEntityDao().queryBuilder()
                        .where(NoticeEntityDao.Properties.NoticeId.eq(getMD5Id(link)))
                        .where(NoticeEntityDao.Properties.HadShowed.eq(false))
                        .where(NoticeEntityDao.Properties.StartTime.le(System.currentTimeMillis()))
                        .where(NoticeEntityDao.Properties.ExpirTime.ge(System.currentTimeMillis()))
                        .list();
                for (NoticeEntity noticeEntity : noticeEntities) {
                    noticeEntity.hadShowed = true;
                    DatabaseManager.getInstance().getNoticeEntityDao().update(noticeEntity);
                }
            }
        });
    }

    public static String getMD5Id(String link) {
        return MD5Utils.MD5(link + AccountManager.getInstance().getAccount().ssoid);
    }
}